/* 
 * File:   main.cpp
 * Author: Administrator
 *
 * Created on 2016年9月23日, 下午9:21
 */

#include <stdlib.h>
#include "hash.h"
#include "regex/stack.h"
#include "parser.h"
#include "vm.h"
#include "secd.h"
#include "buildin.h"
#include <stdio.h>
#include <string.h>
//#include "process_stat.h"

/*
 *
 (begin (define test (lambda [x] (if (= x 0) 0 (test (- x 1))))) (test 100000))
 test 10000000
 real    2m44.792s
 user    0m0.015s
 sys     0m0.030s
 
 test 100000
 real    0m0.287s
 user    0m0.015s
 sys     0m0.000s
CPU使用率: 4294967295
内存使用: 662183936 字节
虚拟内存使用: 1096736768 字节
总共读: 0 字节
总共写: 0 字节

integer double bool with gc
object: 3157
CPU使用率: 4294967295
内存使用: 639987712 字节
虚拟内存使用: 1074511872 字节
总共读: 0 字节
总共写: 0 字节
|—<integer 0>

test 1000000   
user    0m0.015s
sys     0m0.000s
CPU使用率: 4294967295
内存使用: 3149582336 字节
虚拟内存使用: 2357657600 字节
总共读: 0 字节
总共写: 0 字节
 
integer double bool with gc
object: 853
CPU使用率: 4294967295
内存使用: 272785408 字节
虚拟内存使用: 2133213184 字节
总共读: 0 字节
总共写: 26806 字节
|—<integer 0>

real    0m50.561s
user    0m0.000s
sys     0m0.031s

(begin (define test (lambda [x y] (if (= x 0) y (recur (- x 1) (+ x y))))) (test 1000 0))
 */

void add(struct SecdVm *vm, tiny_value *args){
    tiny_value *ret = NULL;
    ret=gc_make_integer(vm, 0);
    if(is_integer(args->value.list) && is_integer(args->value.list->tail)){
        ret->value.int_ = args->value.list->value.int_ + args->value.list->tail->value.int_ ;
    }else{
        //error
    }
    //printf("xxx");
    //display_value(ret, 0);
    push(vm->stack, ret); 
}

int main(int argc, char **argv)
{
    char *code = "(begin (define test (lambda [x y] (if (= x 0) y (recur (- x 1) (+ x y))))) (test 5000 0))";
    tiny_value *v = tiny_compile(code, strlen(code));
    //printf("%p\n", v);
    trans_let_to_lambda(v);
    //display_value(v, 0);
    struct SecdVm *vm = make_secd_vm();
    tiny_bytecode *b = tiny_compile_secd(v);
    display_bytecode(b);
    SecdVm_run(vm,b);
    //return 0;
    //tiny_interp *interp = make_interp();
    //init_buildin(interp);
    //tiny_value *x=tiny_eval(interp, v,interp->top_level);
    /*
    int cpu;
    /*int cpu;
    uint64_t mem = 0, vmem = 0, r = 0, w = 0;

    cpu = get_cpu_usage();
    get_memory_usage(&mem, &vmem);
    get_io_bytes(&r, &w);

    printf("object: %d\n", vm->count);
    printf("CPU使用率: %u\n", cpu);
    printf("内存使用: %u 字节\n", mem);
    printf("虚拟内存使用: %u 字节\n", vmem);
    printf("总共读: %u 字节\n", r);
    printf("总共写: %u 字节\n", w);
    */
   //display_value(x, 0);
    display_value(pop(vm->stack), 0);
    //    tiny_interp *interp = make_interp();
    //    init_buildin(interp);
    //    tiny_value *r = tiny_eval(interp,v,interp->top_level);
    //    display_value(r,0);
    return 0;
}
